package com.kuangstudy.controller;

import com.kuangstudy.entity.Product;
import com.kuangstudy.service.redis.RedisCreatorIdService;
import com.kuangstudy.utils.ids.SequenceUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * @author renyitong
 * @version 1.0.0
 * @createTime 2023年09月14日
 * @Description 海量的数据存储一般都采用分库分表来进行存储。一般最多分1024个表，一般建表如：product_0，product_1，product_2…..product_1023个表。
 */
@RestController
@Api(tags = "产品相关操作")
@Slf4j
public class ProductController {

    @Autowired
    private RedisCreatorIdService idService;

    @Autowired
    private SequenceUtils sequenceUtils;

    @PostMapping("/product/creator")
    @ApiOperation("生成全局id分库分表")
    public String createIds() {
        // 1、创建产品的分布式全局id
        Long productId = idService.incrmentid("ids:create:product");
        // 2、生成产品的信息
        Product product = new Product();
        product.setId(productId);
        // product.setTitle("可口可乐-" + productId);
        log.info("生成的产品信息是 : {}", product.toString());
        // 3、存储到指定的库或者表中
        int table = (int) (productId % 1024);
        log.info("保存到的数据库的表是: product_" + table);
        return "product_" + table;
    }


    @PostMapping("/product/creator2")
    @ApiOperation("生成订单流水号")
    public List<String> creatorIds2() {
        // 1:创建产品的分布式全局ID
        List<String> ids = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            String sequence = sequenceUtils.getSequence("TSD-");
            ids.add(sequence);
        }
        return ids;
    }

}
